Skip to main content

Tantangan: Buat Kontrak Kalkulator dengan Move

Di tantangan ini kamu akan membangun smart contract kalkulator sederhana menggunakan Move di Sui. Latihan ini menguatkan pemahamanmu tentang module, entry function, tipe data, assert, dan (opsional) event atau penyimpanan objek.

Tujuan

  • Implementasi operasi aritmetika dasar: add, sub, mul, div pada u64.
  • Mengeksposnya sebagai entry function yang bisa dipanggil via transaksi.
  • Menangani edge case (mis. pembagian dengan nol).
  • Opsional: memancarkan event atau menyimpan hasil agar dapat diamati on-chain.

Ketentuan

  1. Buat paket Move baru atau gunakan paket yang sudah ada.
  2. Tambahkan module, misalnya calculator, yang berisi:
    • Entry function: add(a: u64, b: u64), sub(a: u64, b: u64), mul(a: u64, b: u64), div(a: u64, b: u64).
    • Untuk div, cegah pembagian dengan nol menggunakan assert! atau skema aman lainnya.
  3. Opsional: Definisikan event seperti CalcEvent dengan field { op: vector<u8>, a: u64, b: u64, result: u64 } dan emit di setiap fungsi.
  4. Build dan publish paket ke jaringan Sui.
  5. Panggil fungsi-fungsinya dan amati hasilnya di Sui Explorer (via event atau objek yang disimpan).

Contoh rangka

module your_pkg::calculator {
use sui::event;

public struct CalcEvent has copy, drop {
op: vector<u8>,
a: u64,
b: u64,
result: u64,
}

entry fun add(a: u64, b: u64, _ctx: &mut TxContext) {
let r = a + b;
event::emit(CalcEvent { op: b"add", a, b, result: r });
}

entry fun sub(a: u64, b: u64, _ctx: &mut TxContext) {
let r = a - b;
event::emit(CalcEvent { op: b"sub", a, b, result: r });
}

entry fun mul(a: u64, b: u64, _ctx: &mut TxContext) {
let r = a * b;
event::emit(CalcEvent { op: b"mul", a, b, result: r });
}

entry fun div(a: u64, b: u64, _ctx: &mut TxContext) {
assert!(b != 0, 0);
let r = a / b;
event::emit(CalcEvent { op: b"div", a, b, result: r });
}
}

Catatan:

  • Entry function tidak mengembalikan nilai ke pemanggil transaksi, jadi hasil diekspos via event (atau ditulis ke objek yang kamu miliki).
  • Ganti your_pkg dengan nama paketmu sendiri.
  • Kamu bisa mengenkode op sebagai bytes (vector<u8>) atau memakai tipe event terpisah per operasi.

Build dan publish

  1. Build lokal:
    • sui move build
  2. Konfigurasi Sui client ke jaringan pilihan (devnet/testnet/localnet).
  3. Publish:
    • sui client publish --gas-budget <amount>
  4. Salin Package ID yang terbit.

Panggil fungsinya

Gunakan sui client call dengan package, module, dan nama fungsi. Contoh:

sui client call \
--package <PACKAGE_ID> \
--module calculator \
--function add \
--args 7 5 \
--gas-budget 10000000

Ulangi untuk sub, mul, div. Lalu buka transaksi di Sui Explorer untuk melihat event yang dipancarkan.

Ide bonus

  • Buat objek Calculator yang menyimpan hasil terakhir per pemilik.
  • Tambahkan pengecekan aman untuk underflow/overflow bila perlu.
  • Tambah operasi pangkat atau modulo.
  • Tambahkan unit test Move untuk memverifikasi logika. In conclusion, this lesson allowed you to practically apply your Sui Move and blockchain knowledge by creating and deploying a calculator (+,-,x,%) contract.

In the next lesson, we will focus on learning the solution to this assignment.